/*
Driver.java
Fecha: 21 de julio de 2011
Autor: Claudia Grajeda
Descripcion: uso de pila  y arreglos
*/


import java.util.Scanner;
import java.util.InputMismatchException;



public class Driver{ 

	public static void main (String[] args){
	
		//Declaracion de objetos
		Scanner datos = new Scanner(System.in);
		Formato<Double> lista = new Formato<Double>();
		
		
		//variables
		int opcion, subopcion;
		double numero, num1, num2, num3;
		
		//------------
		System.out.println("\n   HOJA 2 POSTFIX! :O)\n");
		
		
		do{
            menu();
            //-----------------------------------------------------
            opcion = (int)obtenerNumero("QUE DESEA INGRESAR? ", false);
            if (opcion < 0)
                opcion = 0;
            //-----------------------------------------------------
            switch(opcion){
                case 1://ingresar numero
					System.out.println("\n Ingrese un operando o dato ");
					numero = datos.nextInt();
					//if (numero <= && numero >= 1 ){
					lista.push(numero);
					datos.nextLine();					
					System.out.println(lista.toString());
					break;
				
				case 2: //ingresar operacion
					System.out.println("| 1. Sumar     2. Restar     3. Multiplicar     4. Dividir  |");
					subopcion = datos.nextInt();
					datos.nextLine();
					
					switch(subopcion){
						case 1: // suma
							System.out.println("\n SUMA:  \n");
							
							num2 = lista.pop(); // sacar el ultimo numero ingresado
							num1 = lista.pop(); // obtener el ultimo numero o el que saldria
							//lista.push(num2);
							num3 = lista.sumar(num1,num2);
							lista.push(num3);
							System.out.println(lista.toString());
							break;
						case 2://resta
							System.out.println("\n RESTA \n");
							num2 = lista.pop(); // sacar el ultimo numero ingresado
							num1 = lista.get(); // obtener el ultimo numero o el que saldria
							lista.push(num2);
							num3 = lista.resta(num1,num2);
							lista.push(num3);
							System.out.println(lista.toString());
							break;
						case 3://multiplica
							System.out.println("\n MULTIPLICACION \n");
							num2 = lista.pop(); // sacar el ultimo numero ingresado
							num1 = lista.get(); // obtener el ultimo numero o el que saldria
							lista.push(num2);
							num3 = lista.multiplicacion(num1,num2);
							lista.push(num3);
							System.out.println(lista.toString());
							break;
						case 4://divide
							System.out.println("\n DIVICION\n");
							num2 = lista.pop(); // sacar el ultimo numero ingresado
							num1 = lista.get(); // obtener el ultimo numero o el que saldria
							lista.push(num2);
							num3 = lista.divicion(num1,num2);
							lista.push(num3);
							System.out.println(lista.toString());
							break;
										
						default:
							System.out.println("\nERROR: ~~> Opcion invalida. :O(\n");            
						
					break;
					}
					break;
				
				case 3: //salir
					System.out.println("\nBye! :O)\n");
					break;
					
				default:
                    System.out.println("\nERROR: ~~> Opcion invalida. :O(\n");            
            }
        }while(opcion!=3);
	}
	
	public static void menu(){
		System.out.println();
        System.out.println("+--    MENU DE OPCIONES    --+");
        System.out.println("| 1. Ingresar un dato        |");
		System.out.println("| 2. Ingresar una operacion  |");
        System.out.println("| 3. Salir del programa      |");
		System.out.println("+----------------------------+");
	}
	
	
		
	public static double obtenerNumero(String mensaje, boolean mostrar){
		Scanner ingreso = new Scanner(System.in);
		double num = -1;
			
		System.out.print(mensaje);
		try{
			num = ingreso.nextDouble();
		}
		catch(InputMismatchException exception){
			if (mostrar)
				System.out.println("\nERROR: ~~> Dato invalido. :O(\n");
		}
		finally{
			ingreso.nextLine();//Atrapar el ENTER
		}
		return num;
	}
}